import xlrd

from cmd_type import CmdType
from my_log import my_log
from task import start_task


def run_script(file_name):
    _sheet = get_cmd_sheet(file_name)
    # 数据检查
    _is_pass = check_data(_sheet)
    if not _is_pass:
        my_log.error('输入有误或者已经退出!')
        exit()
    start_task(_sheet)

def get_cmd_sheet(file_name):
    file = f'script/{file_name}'
    # 打开文件
    wb = xlrd.open_workbook(filename=file)
    # 通过索引获取表格sheet页
    return wb.sheet_by_index(0)


# 数据检查
# cmdType.value  1.0 左键单击    2.0 左键双击  3.0 右键单击  4.0 输入  5.0 等待  6.0 滚轮
def check_data(sheet):
    _check_cmd = True
    # 行数检查
    if sheet.nrows < 2:
        my_log.error("请在cmd.xls中填写操作数据")
        _check_cmd = False
    # 每行数据检查
    i = 1
    while i < sheet.nrows:

        _data1 = sheet.row(i)[0]
        _data2 = sheet.row(i)[1]
        _data3 = sheet.row(i)[2]

        # 第1列 操作类型检查
        _cmd_type = _data1
        # _cmd_type
        #           空：0
        #           字符串：1
        #           数字：2
        #           日期：3
        #           布尔：4
        #           error：5
        _max_type = 18
        if _cmd_type.ctype != 2 or not (1 <= int(_cmd_type.value) <= _max_type):
            my_log.error(f"[第{i + 1}行, 第2列] 数据错误, 内容必须为数字类型(1-{_max_type}) value = {_cmd_type.value}")
            _check_cmd = False

        _type_value = int(_cmd_type.value)

        # 第2列 内容检查
        _cmd_value = _data2
        # 读图点击类型指令，内容必须为字符串类型
        if _type_value == CmdType.CLICK_IMAGE or _type_value == CmdType.DOUBLE_CLICK_IMAGE or _type_value == CmdType.RIGHT_CLICK_IMAGE:
            if _cmd_value.ctype != 1:
                my_log.error(f"[第{i + 1}行, 第3列] 数据错误, 内容必须为字符串类型 value = {_cmd_value}")
                _check_cmd = False
        # 输入类型，内容不能为空
        if _type_value == CmdType.INPUT_TEXT:
            if _cmd_value.ctype == 0:
                my_log.error(f"[第{i + 1}行, 第3列] 数据错误 内容不能为空")
                _check_cmd = False
        # 等待类型，内容必须为数字
        if _type_value == CmdType.WAIT:
            if _cmd_value.ctype != 2:
                my_log.error(f"[第{i + 1}行, 第3列] 数据错误, 内容必须为数字")
                _check_cmd = False
        # 滚轮事件，内容必须为数字
        if _type_value == CmdType.SCROLL:
            if _cmd_value.ctype != 2:
                my_log.error(f"[第{i + 1}行, 第3列] 数据错误, 内容必须为数字")
                _check_cmd = False
        i += 1
    return _check_cmd

